
#include "./include/udp_sxx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/time.h>

#define PORT 12345
#define TIMEOUT 2 // 超时时间(秒)

// 产品端IP列表
const char target_vxworks_ips[3][16] = {
    "192.168.0.50",
    "192.168.6.21",
    "192.168.16.21"
};

// 测试端源IP列表（需提前在网卡上配置）
const char source_vxworks_ips[3][16] = {
    "192.168.0.10",  // 与192.168.0.50同网段
    "192.168.6.10",  // 与192.168.6.21同网段
    "192.168.16.10"  // 与192.168.16.21同网段
};

// 产品端IP列表
const char target_tianmai_ips[3][16] = {
    "192.168.6.200",
    "192.168.0.200",
    "192.168.100.200"
};

// 测试端源IP列表（需提前在网卡上配置）
const char source_tianmai_ips[3][16] = {
    "192.168.6.20",  // 与192.168.0.50同网段
    "192.168.0.20",  // 与192.168.6.21同网段
    "192.168.100.20"  // 与192.168.16.21同网段
};
// 产品端IP列表
char target_ips[3][16];

// 测试端源IP列表（需提前在网卡上配置）
char source_ips[3][16];

void test_udp() 
{ 
    char buffer[128];
    char test_msg[128] = "PING_TEST";

    for (int i = 1; i < 3; i++) 
    {
        int sockfd;
        struct sockaddr_in target_addr, source_addr;

        // 创建UDP套接字
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
            perror("套接字创建失败");
            exit(EXIT_FAILURE);
        }

        // 设置源IP和端口
        memset(&source_addr, 0, sizeof(source_addr));
        source_addr.sin_family = AF_INET;
        source_addr.sin_port = htons(0); // 系统自动分配端口
        inet_pton(AF_INET, source_ips[i], &source_addr.sin_addr);

        // 绑定源地址
        if (bind(sockfd, (const struct sockaddr*)&source_addr, sizeof(source_addr)) < 0) {
            perror("套接字绑定失败");
            close(sockfd);
            continue;
        }

        // 设置目标地址
        memset(&target_addr, 0, sizeof(target_addr));
        target_addr.sin_family = AF_INET;
        target_addr.sin_port = htons(PORT);
        inet_pton(AF_INET, target_ips[i], &target_addr.sin_addr);

        usleep(500000);

        sprintf(test_msg, "%s PING_TEST", target_ips[i] );

        printf("给网口%d 发送数据:%s\n",i, test_msg);
        // 发送测试数据
        if (sendto(sockfd, test_msg, strlen(test_msg), 0,
                  (struct sockaddr*)&target_addr, sizeof(target_addr)) < 0) {
            perror("发送失败");
            close(sockfd);
            continue;
        }
        
        // 设置接收超时
        struct timeval tv;
        tv.tv_sec = TIMEOUT;
        tv.tv_usec = 0;
        setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));

        // 接收回复
        socklen_t len = sizeof(target_addr);
        int n = recvfrom(sockfd, buffer, sizeof(buffer), 0,
                        (struct sockaddr*)&target_addr, &len);
        if (n < 0) 
        {
            printf("%s没有响应\n", target_ips[i]);
            usleep(50000);
            printf("[测试工装] ❌ 网口%d:%s 测试失败!\n",i, target_ips[i]);
        } 
        else 
        {
            printf("%s收到数据:%s\n", target_ips[i],buffer);
            usleep(50000);
            buffer[n] = '\0';
            if (strcmp(buffer, test_msg) == 0) 
            {
                printf("[测试工装] ✅ 网口%d:%s 测试通过!\n",i, target_ips[i]);
            } else {
                printf("[测试工装] ❌ 网口%d:%s 测试失败!\n",i, target_ips[i]);
            }
        }
        printf("\n");
        usleep(500000);
        close(sockfd);
    }
    return ;
}